Q1
First I load the data files
Next I reshape dat into the handful data format. I use tidyr package for the aim instead of reshape package because the foramer is the improved version of the latter.
install.packages('tidyverse')
URL 'https://cran.rstudio.com/bin/macosx/mavericks/contrib/3.3/tidyverse_1.1.1.tgz' を試しています
Content type 'application/x-gzip' length 37228 bytes (36 KB)
==================================================
downloaded 36 KB
The downloaded binary packages are in
/var/folders/1w/nyst5xl16t329h4gpz0j49hm0000gn/T//Rtmp2exVAC/downloaded_packages
library(tidyverse)
Loading tidyverse: ggplot2
Loading tidyverse: tibble
Loading tidyverse: tidyr
Loading tidyverse: readr
Loading tidyverse: purrr
Loading tidyverse: dplyr
Conflicts with tidy packages ----------------------------------------------------------------------------------------------------------------------------------
filter(): dplyr, stats
lag(): dplyr, stats
dat <- dat %>%
tidyr::gather(key=From, value=value, Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,District\ of\ Columbia,Florida,Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa,Kansas,Kentucky,Louisiana,Maine,Maryland,Massachusetts,Michigan,Minnesota,Mississippi,Missouri,Montana,Nebraska,Nevada,New\ Hampshire,New\ Jersey,New\ Mexico,New\ York,North\ Carolina,North\ Dakota,Ohio,Oklahoma,Oregon,Pennsylvania,Rhode\ Island,South\ Carolina,South\ Dakota,Tennessee,Texas,Utah,Vermont,Virginia,Washington,West\ Virginia,Wisconsin,Wyoming)
エラー: 想定外の入力です in:
"dat <- dat %>%
tidyr::gather(key=From, value=value, Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,District\"
Delete the puctuations.
Then I add two new columns to the above data frame.
d1 <- merge(dat, states, by.x="From", by.y="States")
d1 <- d1[,c(-5,-6)]
names(d1)[4] <- "ID_From"
d2 <- merge(d1, states, by.x="To", by.y="States")
d2 <- d2[,c(-6,-7)]
names(d2)[5] <- "ID_To"
dat <- d2
dat
Sort the data frame in the ascending order
dat <- arrange(dat, ID_From)
dat <- arrange(dat, ID_To)
dat
Convert the above data frame into the matrix form
Drawing the chord diagram
chorddiag(as.matrix(t5),groupColors=states$Color,showTicks=F,groupnamePadding = 20,groupThickness=.05,groupnameFontsize=10)
row names of the 'data' matrix differ from its column names or the 'groupNames' argument.
Q2
まだindividualを入れてないです。 Read “Stops On Lines” and the all GIS data of bus lines.
library(dplyr)
library(sp)
library(rgdal)
library(leaflet)
library(ggmap)
# Bus Stops
SOL <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/BusStops1216","StopsOnLines1216")
SOL.pj <- spTransform(SOL, CRS("+proj=longlat +datum=WGS84"))
# Bus Routes
CC <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/ComCir1216","ComCir1216")
CC.pj <- spTransform(CC, CRS("+proj=longlat +datum=WGS84"))
LE <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/LimExp1216","LimExp1216")
LE.pj <- spTransform(LE, CRS("+proj=longlat +datum=WGS84"))
LCBD <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/LocalCBD1216","LocalCBD1216")
LCBD.pj <- spTransform(LCBD, CRS("+proj=longlat +datum=WGS84"))
LNCBD <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/LocalNonCBD1216","LocalNonCBD1216")
LNCBD.pj <- spTransform(LNCBD, CRS("+proj=longlat +datum=WGS84"))
RBRT <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/RapidBRT1216","RapidBRT1216")
RBRT.pj <- spTransform(RBRT, CRS("+proj=longlat +datum=WGS84"))
# とりあえずindividual2についてのみreadできることを確認。一旦放置してこれ以外でできるか試す。
I2 <- readOGR("/Users/susu/Desktop/Hong\ Kong/Semester2/Big_Data/assignment_data/as1/Individuals1216","2")
I2.pj <- spTransform(I2, CRS("+proj=longlat +datum=WGS84"))
make Line_list
tmp_CC <- geometry(CC.pj)
tmp_LE <- geometry(LE.pj)
tmp_LCBD <- geometry(LCBD.pj)
tmp_LNCBD <- geometry(LNCBD.pj)
tmp_RBRT <- geometry(RBRT.pj)
tmps <- list(tmp_CC, tmp_LE, tmp_LCBD, tmp_LNCBD, tmp_RBRT)
Line_list <- list()
for (i in 1:5){
for (j in 1:length(tmps[[i]])){
Line_list <- c(Line_list, tmps[[i]][j]@lines[[1]]@Lines)
}
}
make new_id
pjs <- list(CC.pj, LE.pj, LCBD.pj, LNCBD.pj, RBRT.pj)
LinLSs <- list()
for (i in 1:5){
LinLSs <- c(LinLSs, sapply(pjs[[i]]@lines, function(x) length(x@Lines)))
}
LinLSs <- LinLSs %>% unlist()
new_id <- sapply(1:length(LinLSs), function(x) paste0(x, "_", seq.int(LinLSs[[x]]))) %>%
unlist()
SLDF <- mapply(function(x, y) Lines(x, ID = y), x = Line_list, y = new_id) %>%
list() %>%
SpatialLines() %>%
SpatialLinesDataFrame(data = DAT)
SpatialLines(.) でエラー:
lines list not exclusively filled with Lines objects
make new lines and LA map
LS0tCnRpdGxlOiAiQmlnIERhdGEgQW5hbHl0aWNzIEFzc2lnbm1lbnQgMSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgUTEKCkZpcnN0IEkgbG9hZCB0aGUgZGF0YSBmaWxlcwpgYGB7cn0KZGF0IDwtIHJlYWQuY3N2KCIvVXNlcnMvc3VzdS9EZXNrdG9wL0hvbmdcIEtvbmcvU2VtZXN0ZXIyL0JpZ19EYXRhL2Fzc2lnbm1lbnRfZGF0YS9hczEvbWlncmF0aW9uMjAxMi5jc3YiKQpoZWFkKGRhdCkKYGBgCgpgYGB7cn0Kc3RhdGVzIDwtIHJlYWQuY3N2KCIvVXNlcnMvc3VzdS9EZXNrdG9wL0hvbmdcIEtvbmcvU2VtZXN0ZXIyL0JpZ19EYXRhL2Fzc2lnbm1lbnRfZGF0YS9hczEvc3RhdGVzX2Nob3JkLmNzdiIpCnN0YXRlcwpgYGAKCk5leHQgSSByZXNoYXBlIGRhdCBpbnRvIHRoZSBoYW5kZnVsIGRhdGEgZm9ybWF0LiBJIHVzZSAqKnRpZHlyIHBhY2thZ2UqKiBmb3IgdGhlIGFpbSBpbnN0ZWFkIG9mICoqcmVzaGFwZSBwYWNrYWdlKiogYmVjYXVzZSB0aGUgZm9yYW1lciBpcyB0aGUgaW1wcm92ZWQgdmVyc2lvbiBvZiB0aGUgbGF0dGVyLgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoJ3RpZHl2ZXJzZScpCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCmBgYHtyfQpkYXQgPC0gZGF0ICU+JQp0aWR5cjo6Z2F0aGVyKGtleT1Gcm9tLCB2YWx1ZT12YWx1ZSwgQWxhYmFtYSxBbGFza2EsQXJpem9uYSxBcmthbnNhcyxDYWxpZm9ybmlhLENvbG9yYWRvLENvbm5lY3RpY3V0LERlbGF3YXJlLERpc3RyaWN0Lm9mLkNvbHVtYmlhLEZsb3JpZGEsR2VvcmdpYSxIYXdhaWksSWRhaG8sSWxsaW5vaXMsSW5kaWFuYSxJb3dhLEthbnNhcyxLZW50dWNreSxMb3Vpc2lhbmEsTWFpbmUsTWFyeWxhbmQsTWFzc2FjaHVzZXR0cyxNaWNoaWdhbixNaW5uZXNvdGEsTWlzc2lzc2lwcGksTWlzc291cmksTW9udGFuYSxOZWJyYXNrYSxOZXZhZGEsTmV3LkhhbXBzaGlyZSxOZXcuSmVyc2V5LE5ldy5NZXhpY28sTmV3LllvcmssTm9ydGguQ2Fyb2xpbmEsTm9ydGguRGFrb3RhLE9oaW8sT2tsYWhvbWEsT3JlZ29uLFBlbm5zeWx2YW5pYSxSaG9kZS5Jc2xhbmQsU291dGguQ2Fyb2xpbmEsU291dGguRGFrb3RhLFRlbm5lc3NlZSxUZXhhcyxVdGFoLFZlcm1vbnQsVmlyZ2luaWEsV2FzaGluZ3RvbixXZXN0LlZpcmdpbmlhLFdpc2NvbnNpbixXeW9taW5nKQpgYGAKCkRlbGV0ZSB0aGUgcHVjdHVhdGlvbnMuCgpgYGB7cn0KZGF0IDwtIGRhdGEuZnJhbWUoYXBwbHkoZGF0LCAyLCBmdW5jdGlvbih5KSBnc3ViKCJbWzpwdW5jdDpdXSIsICIgIiwgeSkpKQpkYXQKYGBgCgpUaGVuIEkgYWRkIHR3byBuZXcgY29sdW1ucyB0byB0aGUgYWJvdmUgZGF0YSBmcmFtZS4KCmBgYHtyfQpkMSA8LSBtZXJnZShkYXQsIHN0YXRlcywgYnkueD0iRnJvbSIsIGJ5Lnk9IlN0YXRlcyIpCmQxIDwtIGQxWyxjKC01LC02KV0KbmFtZXMoZDEpWzRdIDwtICJJRF9Gcm9tIgoKZDIgPC0gbWVyZ2UoZDEsIHN0YXRlcywgYnkueD0iVG8iLCBieS55PSJTdGF0ZXMiKQpkMiA8LSBkMlssYygtNiwtNyldCm5hbWVzKGQyKVs1XSA8LSAiSURfVG8iCmRhdCA8LSBkMgpkYXQKYGBgCgpTb3J0IHRoZSBkYXRhIGZyYW1lIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIKCmBgYHtyfQpkYXQgPC0gYXJyYW5nZShkYXQsIElEX0Zyb20pCmRhdCA8LSBhcnJhbmdlKGRhdCwgSURfVG8pCmRhdApgYGAKCkNvbnZlcnQgdGhlIGFib3ZlIGRhdGEgZnJhbWUgaW50byB0aGUgbWF0cml4IGZvcm0KCmBgYHtyfQp0MSA8LSBkYXRbLGMoMSwyLDQsNSldCnQxIDwtIHQxICU+JQogIHNwcmVhZChrZXk9VG8sIHZhbHVlPUlEX1RvKQoKdDIgPC0gZGF0WyxjKDEsMiwzLDQpXQp0MiA8LSB0MiAlPiUKICBzcHJlYWQoa2V5PVRvLCB2YWx1ZT12YWx1ZSkKCnQzIDwtIHJiaW5kKHQxWzEsXSx0MikKdDMkRnJvbSA8LSBhcy5jaGFyYWN0ZXIodDMkRnJvbSkKdDNbMSwyXSA8LSAwCnQzWzEsMV0gPC0gIklEX1RvIgp0MyA8LSB0MyAlPiUKICBhcnJhbmdlKElEX0Zyb20pCgpsaWJyYXJ5KGRhdGEudGFibGUpCnNldGNvbG9yZGVyKHQzLGMoIkZyb20iLCJJRF9Gcm9tIiwiQ29ubmVjdGljdXQiLCJNYWluZSIsIk1hc3NhY2h1c2V0dHMiLCJOZXcgSGFtcHNoaXJlIiwiUmhvZGUgSXNsYW5kIiwKIlZlcm1vbnQiLCJOZXcgSmVyc2V5IiwiTmV3IFlvcmsiLCJQZW5uc3lsdmFuaWEiLCJJbGxpbm9pcyIsIkluZGlhbmEiLAoiTWljaGlnYW4iLCJPaGlvIiwiV2lzY29uc2luIiwiSW93YSIsIkthbnNhcyIsIk1pbm5lc290YSIsCiJNaXNzb3VyaSIsIk5lYnJhc2thIiwiTm9ydGggRGFrb3RhIiwiU291dGggRGFrb3RhIiwiRGVsYXdhcmUiLCJGbG9yaWRhIiwKIkdlb3JnaWEiLCJNYXJ5bGFuZCIsIk5vcnRoIENhcm9saW5hIiwiU291dGggQ2Fyb2xpbmEiLCJWaXJnaW5pYSIsIkRpc3RyaWN0IG9mIENvbHVtYmlhIiwKIldlc3QgVmlyZ2luaWEiLCJBbGFiYW1hIiwiS2VudHVja3kiLCJNaXNzaXNzaXBwaSIsIlRlbm5lc3NlZSIsIkFya2Fuc2FzIiwKIkxvdWlzaWFuYSIsIk9rbGFob21hIiwiVGV4YXMiLCJBcml6b25hIiwiQ29sb3JhZG8iLCJJZGFobyIsCiJNb250YW5hIiwiTmV2YWRhIiwiTmV3IE1leGljbyIsIlV0YWgiLCJXeW9taW5nIiwiQWxhc2thIiwKIkNhbGlmb3JuaWEiLCJIYXdhaWkiLCJPcmVnb24iLCJXYXNoaW5ndG9uIikpCgp0MyA8LSB0M1tjKC0xKSxjKC0yKV0KCnQ0IDwtIHQzWywtMV0Kcm93bmFtZXModDQpIDwtIHQzWywxXQoKdDUgPC0gZGF0YS5mcmFtZShhcHBseSh0NCwgMiwgZnVuY3Rpb24oeSkgYXMubnVtZXJpYyh5KSkpCnJvd25hbWVzKHQ1KSA8LSB0M1ssMV0KdDUKYGBgCgpEcmF3aW5nIHRoZSBjaG9yZCBkaWFncmFtCmBgYHtyfQpsaWJyYXJ5KGNob3JkZGlhZykKCmNob3JkZGlhZyhhcy5tYXRyaXgodDUpLGdyb3VwQ29sb3JzPXN0YXRlcyRDb2xvcixzaG93VGlja3M9Rixncm91cG5hbWVQYWRkaW5nPTIwLGdyb3VwVGhpY2tuZXNzPS4wNSxncm91cG5hbWVGb250c2l6ZT0xMCkKYGBgCgoKIyMgUTIKCuOBvuOBoGluZGl2aWR1YWzjgpLlhaXjgozjgabjgarjgYTjgafjgZnjgIIKUmVhZCAiU3RvcHMgT24gTGluZXMiIGFuZCB0aGUgYWxsIEdJUyBkYXRhIG9mIGJ1cyBsaW5lcy4KYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc3ApCmxpYnJhcnkocmdkYWwpCmxpYnJhcnkobGVhZmxldCkKbGlicmFyeShnZ21hcCkKCiMgQnVzIFN0b3BzClNPTCA8LSByZWFkT0dSKCIvVXNlcnMvc3VzdS9EZXNrdG9wL0hvbmdcIEtvbmcvU2VtZXN0ZXIyL0JpZ19EYXRhL2Fzc2lnbm1lbnRfZGF0YS9hczEvQnVzU3RvcHMxMjE2IiwiU3RvcHNPbkxpbmVzMTIxNiIpClNPTC5waiA8LSBzcFRyYW5zZm9ybShTT0wsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKCiMgQnVzIFJvdXRlcwpDQyA8LSByZWFkT0dSKCIvVXNlcnMvc3VzdS9EZXNrdG9wL0hvbmdcIEtvbmcvU2VtZXN0ZXIyL0JpZ19EYXRhL2Fzc2lnbm1lbnRfZGF0YS9hczEvQ29tQ2lyMTIxNiIsIkNvbUNpcjEyMTYiKQpDQy5waiA8LSBzcFRyYW5zZm9ybShDQywgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpMRSA8LSByZWFkT0dSKCIvVXNlcnMvc3VzdS9EZXNrdG9wL0hvbmdcIEtvbmcvU2VtZXN0ZXIyL0JpZ19EYXRhL2Fzc2lnbm1lbnRfZGF0YS9hczEvTGltRXhwMTIxNiIsIkxpbUV4cDEyMTYiKQpMRS5waiA8LSBzcFRyYW5zZm9ybShMRSwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpMQ0JEIDwtIHJlYWRPR1IoIi9Vc2Vycy9zdXN1L0Rlc2t0b3AvSG9uZ1wgS29uZy9TZW1lc3RlcjIvQmlnX0RhdGEvYXNzaWdubWVudF9kYXRhL2FzMS9Mb2NhbENCRDEyMTYiLCJMb2NhbENCRDEyMTYiKQpMQ0JELnBqIDwtIHNwVHJhbnNmb3JtKExDQkQsIENSUygiK3Byb2o9bG9uZ2xhdCArZGF0dW09V0dTODQiKSkKTE5DQkQgPC0gcmVhZE9HUigiL1VzZXJzL3N1c3UvRGVza3RvcC9Ib25nXCBLb25nL1NlbWVzdGVyMi9CaWdfRGF0YS9hc3NpZ25tZW50X2RhdGEvYXMxL0xvY2FsTm9uQ0JEMTIxNiIsIkxvY2FsTm9uQ0JEMTIxNiIpCkxOQ0JELnBqIDwtIHNwVHJhbnNmb3JtKExOQ0JELCBDUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpClJCUlQgPC0gcmVhZE9HUigiL1VzZXJzL3N1c3UvRGVza3RvcC9Ib25nXCBLb25nL1NlbWVzdGVyMi9CaWdfRGF0YS9hc3NpZ25tZW50X2RhdGEvYXMxL1JhcGlkQlJUMTIxNiIsIlJhcGlkQlJUMTIxNiIpClJCUlQucGogPC0gc3BUcmFuc2Zvcm0oUkJSVCwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQoKIyDjgajjgorjgYLjgYjjgZppbmRpdmlkdWFsMuOBq+OBpOOBhOOBpuOBruOBv3JlYWTjgafjgY3jgovjgZPjgajjgpLnorroqo3jgILkuIDml6bmlL7nva7jgZfjgabjgZPjgozku6XlpJbjgafjgafjgY3jgovjgYvoqabjgZnjgIIKSTIgPC0gcmVhZE9HUigiL1VzZXJzL3N1c3UvRGVza3RvcC9Ib25nXCBLb25nL1NlbWVzdGVyMi9CaWdfRGF0YS9hc3NpZ25tZW50X2RhdGEvYXMxL0luZGl2aWR1YWxzMTIxNiIsIjIiKQpJMi5waiA8LSBzcFRyYW5zZm9ybShJMiwgQ1JTKCIrcHJvaj1sb25nbGF0ICtkYXR1bT1XR1M4NCIpKQpgYGAKCm1ha2UgTGluZV9saXN0CmBgYHtyfQp0bXBfQ0MgPC0gZ2VvbWV0cnkoQ0MucGopCnRtcF9MRSA8LSBnZW9tZXRyeShMRS5waikKdG1wX0xDQkQgPC0gZ2VvbWV0cnkoTENCRC5waikKdG1wX0xOQ0JEIDwtIGdlb21ldHJ5KExOQ0JELnBqKQp0bXBfUkJSVCA8LSBnZW9tZXRyeShSQlJULnBqKQp0bXBzIDwtIGxpc3QodG1wX0NDLCB0bXBfTEUsIHRtcF9MQ0JELCB0bXBfTE5DQkQsIHRtcF9SQlJUKQoKTGluZV9saXN0IDwtIGxpc3QoKQpmb3IgKGkgaW4gMTo1KXsKICBmb3IgKGogaW4gMTpsZW5ndGgodG1wc1tbaV1dKSl7CiAgICBMaW5lX2xpc3QgPC0gYyhMaW5lX2xpc3QsIHRtcHNbW2ldXVtqXUBsaW5lc1tbMV1dQExpbmVzKQogIH0KfQpgYGAKCgptYWtlIG5ld19pZApgYGB7cn0KcGpzIDwtIGxpc3QoQ0MucGosIExFLnBqLCBMQ0JELnBqLCBMTkNCRC5waiwgUkJSVC5waikKTGluTFNzIDwtIGxpc3QoKQpmb3IgKGkgaW4gMTo1KXsKIExpbkxTcyA8LSBjKExpbkxTcywgc2FwcGx5KHBqc1tbaV1dQGxpbmVzLCBmdW5jdGlvbih4KSBsZW5ndGgoeEBMaW5lcykpKQp9CkxpbkxTcyA8LSBMaW5MU3MgJT4lIHVubGlzdCgpCgpuZXdfaWQgPC0gc2FwcGx5KDE6bGVuZ3RoKExpbkxTcyksIGZ1bmN0aW9uKHgpIHBhc3RlMCh4LCAiXyIsIHNlcS5pbnQoTGluTFNzW1t4XV0pKSkgJT4lIAogIHVubGlzdCgpCmBgYAoKYGBge3J9CiMjIG1ha2UgYSBuZXcgZGF0YS5mcmFtZSAob25seSByb3V0ZV9pZCkKREFUPWRhdGEuZnJhbWUobWF0cml4KHJlcChOQSwxKSxucm93PTEpKVstMSxdCmZvciAoaSBpbiAxOjUpewogIGRmIDwtIGRhdGEuZnJhbWUocm91dGVfaWQgPSBwanNbW2ldXUBkYXRhJFZBUl9JREVOVCkKICBEQVQgPC0gcmJpbmQoREFULCBkZikKfQpyb3duYW1lcyhEQVQpIDwtIG5ld19pZAoKU0xERiA8LSBtYXBwbHkoZnVuY3Rpb24oeCwgeSkgTGluZXMoeCwgSUQgPSB5KSwgeCA9IExpbmVfbGlzdCwgeSA9IG5ld19pZCkgJT4lCiAgI2xpc3QoKSAlPiUKICBTcGF0aWFsTGluZXMoKSAlPiUgCiAgU3BhdGlhbExpbmVzRGF0YUZyYW1lKGRhdGEgPSBEQVQpCmBgYAoKCm1ha2UgbmV3IGxpbmVzIGFuZCBMQSBtYXAKYGBge3J9CmRhdCA8LSBnZW9jb2RlKCdMb3MgQW5nZWxzJykKCmxlYWZsZXQoKSAlPiUKICBzZXRWaWV3KGxuZyA9IGRhdFsnbG9uJ10sIGxhdCA9IGRhdFsnbGF0J10JLCB6b29tID0gMTEpICU+JQogIGFkZFBvbHlsaW5lcyhkYXRhID0gU0xERiwgY29sb3IgPSAiYmxhY2siLCBvcGFjaXR5ID0gMSwgd2VpZ2h0ID0gMSkgJT4lIAogIGFkZENpcmNsZXMoZGF0YT1TT0wucGpAZGF0YSx+TE9ORywgfkxBVCwgY29sb3IgPSAicmVkIiwgd2VpZ2h0ID0gMC4zKSAlPiUKICBhZGRUaWxlcygpCmBgYAoKCiMjIFEzCgpUaGUgY29kZSBpcyBhcyBmb2xsb3dzCmBgYHtyfQpsaWJyYXJ5KHF1YW50bW9kKQpsaWJyYXJ5KGhpZ2hjaGFydGVyKQoKeCA8LSBnZXRTeW1ib2xzKCJBVUQvSlBZIiwgc3JjID0gIm9hbmRhIiwgYXV0by5hc3NpZ24gPSBGQUxTRSkKeSA8LSBnZXRTeW1ib2xzKCJHQlAvVVNEIiwgc3JjID0gIm9hbmRhIiwgYXV0by5hc3NpZ24gPSBGQUxTRSkKCgpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK